package com.smart.community.property.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.smart.community.commons.cache.DataScopeInfo;
import com.smart.community.property.service.DataScopeService;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;

/**
 * 数据权限Feign接口实现Controller
 * 
 * 提供数据权限相关的Feign接口，供其他微服务调用：
 * 1. 获取用户数据权限信息
 * 2. 检查用户权限
 * 3. 获取用户关联的物业公司和社区信息
 * 4. 权限缓存管理
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-01-30
 */
@Slf4j
@RestController
@RequestMapping("/feign/data-scope")
@Tag(name = "数据权限Feign接口", description = "数据权限相关Feign接口")
public class DataScopeFeignController {

    @Autowired
    private DataScopeService dataScopeService;

    /**
     * 根据用户ID获取DataScopeInfo
     * 
     * @param userId 用户ID
     * @return 数据权限信息
     * @throws Exception 统一异常
     */
    @GetMapping("/user/{userId}")
    @Operation(summary = "根据用户ID获取DataScopeInfo")
    public DataScopeInfo getUserDataScope(@Parameter(description = "用户ID") @PathVariable("userId") Long userId) throws Exception {
        // 验证用户ID参数
        if (userId == null) {
            log.warn("DataScopeFeign.getUserDataScope调用失败：用户ID为空");
            throw new IllegalArgumentException("用户ID不能为空");
        }
        
        log.debug("DataScopeFeign.getUserDataScope调用，用户ID: {}", userId);
        return dataScopeService.getUserDataScope(userId);
    }

    /**
     * 检查用户是否有指定物业公司的权限
     * 
     * @param userId 用户ID
     * @param propertyCompanyId 物业公司ID
     * @return 是否有权限
     * @throws Exception 统一异常
     */
    @GetMapping("/has-property-company-permission/{userId}/{propertyCompanyId}")
    @Operation(summary = "检查用户是否有指定物业公司的权限")
    public Boolean hasPropertyCompanyPermission(
            @Parameter(description = "用户ID") @PathVariable("userId") Long userId,
            @Parameter(description = "物业公司ID") @PathVariable("propertyCompanyId") Long propertyCompanyId) throws Exception {
        return dataScopeService.hasPropertyCompanyPermission(userId, propertyCompanyId);
    }

    /**
     * 检查用户是否有指定社区的权限
     * 
     * @param userId 用户ID
     * @param communityId 社区ID
     * @return 是否有权限
     * @throws Exception 统一异常
     */
    @GetMapping("/has-community-permission/{userId}/{communityId}")
    @Operation(summary = "检查用户是否有指定社区的权限")
    public Boolean hasCommunityPermission(
            @Parameter(description = "用户ID") @PathVariable("userId") Long userId,
            @Parameter(description = "社区ID") @PathVariable("communityId") Long communityId) throws Exception {
        return dataScopeService.hasCommunityPermission(userId, communityId);
    }

    /**
     * 清除所有权限缓存
     * 
     * @throws Exception 统一异常
     */
    @PostMapping("/clear-all-permission-cache")
    @Operation(summary = "清除所有权限缓存")
    public void clearAllPermissionCache() throws Exception {
        log.info(" ♂♂♂ 清除所有权限缓存...");
        dataScopeService.clearAllPermissionCache();
        log.info(" ♂♂♂ 所有权限缓存清除成功!");
    }

    /**
     * 获取用户所属物业公司管理的社区ID列表
     * 
     * @param userId 用户ID
     * @return 社区ID列表
     * @throws Exception 统一异常
     */
    @GetMapping("/user-community-ids/{userId}")
    @Operation(summary = "获取用户所属物业公司管理的社区ID列表")
    public List<Long> getUserCommunityIds(@Parameter(description = "用户ID") @PathVariable("userId") Long userId) throws Exception {
        return dataScopeService.getUserCommunityIds(userId);
    }

    /**
     * 获取用户所属的物业公司ID列表
     * 
     * @param userId 用户ID
     * @return 物业公司ID列表
     * @throws Exception 统一异常
     */
    @GetMapping("/user-property-company-ids/{userId}")
    @Operation(summary = "获取用户所属的物业公司ID列表")
    public List<Long> getUserPropertyCompanyIds(@Parameter(description = "用户ID") @PathVariable("userId") Long userId) throws Exception {
        return dataScopeService.getUserPropertyCompanyIds(userId);
    }

    /**
     * 判断用户是否为物业公司用户
     * 
     * @param userId 用户ID
     * @return 是否为物业公司用户
     * @throws Exception 统一异常
     */
    @GetMapping("/is-property-company-user/{userId}")
    @Operation(summary = "判断用户是否为物业公司用户")
    public Boolean isPropertyCompanyUser(@Parameter(description = "用户ID") @PathVariable("userId") Long userId) throws Exception {
        return dataScopeService.isPropertyCompanyUser(userId);
    }

    /**
     * 刷新用户权限缓存
     * 
     * @param userId 用户ID
     * @throws Exception 统一异常
     */
    @PostMapping("/refresh-user-permission-cache/{userId}")
    @Operation(summary = "刷新用户权限缓存")
    public void refreshUserPermissionCache(@Parameter(description = "用户ID") @PathVariable("userId") Long userId) throws Exception {
        log.info(" ♂♂♂ 刷新用户权限缓存，用户ID：{}...", userId);
        dataScopeService.refreshUserPermissionCache(userId);
        log.info(" ♂♂♂ 用户 {} 的权限缓存刷新成功!", userId);
    }

    /**
     * 判断用户是否为超级管理员
     * 
     * @param userId 用户ID
     * @return 是否为超级管理员
     * @throws Exception 统一异常
     */
    @GetMapping("/is-user-super-admin/{userId}")
    @Operation(summary = "判断用户是否为超级管理员")
    public Boolean isUserSuperAdmin(@Parameter(description = "用户ID") @PathVariable("userId") Long userId) throws Exception {
        return dataScopeService.isUserSuperAdmin(userId);
    }
    
    /**
     * 批量验证用户物业公司权限
     * 
     * @param userId 用户ID
     * @param propertyCompanyIds 物业公司ID列表
     * @return 验证结果，true表示有权限，false表示无权限
     * @throws Exception 统一异常
     */
    @PostMapping("/validate-batch-property-company-permission/{userId}")
    @Operation(summary = "批量验证用户物业公司权限")
    public Boolean validateBatchPropertyCompanyPermission(
            @Parameter(description = "用户ID") @PathVariable("userId") Long userId,
            @Parameter(description = "物业公司ID列表") List<Long> propertyCompanyIds) throws Exception {
        dataScopeService.validateBatchPropertyCompanyPermission(userId, propertyCompanyIds);
        return true;
    }
    
    /**
     * 获取用户有权限的社区ID列表
     * 
     * @param userId 用户ID
     * @param communityIds 待检查的社区ID列表
     * @return 有权限的社区ID列表
     * @throws Exception 统一异常
     */
    @PostMapping("/authorized-community-ids/{userId}")
    @Operation(summary = "获取用户有权限的社区ID列表")
    public List<Long> getAuthorizedCommunityIds(
            @Parameter(description = "用户ID") @PathVariable("userId") Long userId,
            @Parameter(description = "待检查的社区ID列表") List<Long> communityIds) throws Exception {
        return dataScopeService.getAuthorizedCommunityIds(userId, communityIds);
    }
    
    /**
     * 检查用户是否有指定模块的权限
     * 
     * @param userId 用户ID
     * @param moduleCode 模块代码
     * @return 是否有权限
     * @throws Exception 统一异常
     */
    @GetMapping("/has-module-permission/{userId}/{moduleCode}")
    @Operation(summary = "检查用户是否有指定模块的权限")
    public Boolean hasModulePermission(
            @Parameter(description = "用户ID") @PathVariable("userId") Long userId,
            @Parameter(description = "模块代码") @PathVariable("moduleCode") String moduleCode) throws Exception {
        return dataScopeService.hasModulePermission(userId, moduleCode);
    }
} 